package cn.dg.manager.common.interceptor;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.context.event.ContextRefreshedEvent;

/**
 * 
 * 数据权限管理器
 * 
 * @author duzh
 * @version [版本号, 2015年11月12日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class DataAuthoritionManager
{
    /**
     * 日志记录
     */
    private static final Logger logger = Logger.getLogger(DataAuthoritionManager.class);
    
    /**
     * 数据权限过滤列表
     */
    private static List<String> dataAuthList = new ArrayList<String>();
    
    /**
     * 初始化动作
     * 
     * @param event
     * @see [类、类#方法、类#成员]
     */
    public static void init(ContextRefreshedEvent event)
    {
        if (null == event.getApplicationContext().getParent())
        {
            logger.debug("scan dataAuth inteface......start");
            
            // 扫描所有数据授权接口
            Map<String, Object> beans = event.getApplicationContext().getBeansWithAnnotation(DataAuthoritionBind.class);
            if (MapUtils.isNotEmpty(beans))
            {
                DataAuthoritionBind dataAuthBind;
                List<String> dataAuthMethods;
                for (Object bean : beans.values())
                {
                    dataAuthBind = bean.getClass().getAnnotation(DataAuthoritionBind.class);
                    if (null != dataAuthBind && ArrayUtils.isNotEmpty(dataAuthBind.value()))
                    {
                        dataAuthMethods = Arrays.asList(dataAuthBind.value());
                        logger.debug("[" + bean.getClass().getName() + "] have data auth methods "
                            + Arrays.toString(dataAuthBind.value()));
                        dataAuthList.addAll(dataAuthMethods);
                    }
                }
            }
            
            logger.debug("scan dataAuth inteface......end");
        }
    }
    
    /**
     * 是否需要数据权限验证
     * 
     * @param sqlKey sql
     *            
     * @return 是否需要验证
     */
    public static boolean isDataAuth(String sqlKey)
    {
        if (StringUtils.isEmpty(sqlKey))
        {
            return false;
        }
        
        // 获取需要数据权限过滤的方法
        if (CollectionUtils.isEmpty(dataAuthList))
        {
            return false;
        }
        
        return dataAuthList.contains(sqlKey);
    }
}
